{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 欠拟合与过拟合\n",
    "##   欠拟合的解决方法：\n",
    "增加输入特征项  \n",
    "增加网络参数  \n",
    "减少正则化参数  \n",
    "\n",
    "## 过拟合的解决方法：\n",
    "数据清洗  \n",
    "增大训练集  \n",
    "采用正则化  \n",
    "增大正则化参数  \n",
    "## 正则化缓解过拟合\n",
    "正则化在损失函数中引入模型复杂度指标，利用给W加权值，弱化了训练数据的噪声（一般不正则化偏置b）  \n",
    "##### loss = loss（y与y_）+REGULARIZER * loss（w）\n",
    "#### 正则化的选择（L1/L2）\n",
    "$$ loss_{L1}(w) = ∑_i|w_i| $$\n",
    "L1正则化大概率会使得很多参数变为零，因此该方法可通过稀疏参数，即减少参数的数量，降低复杂度。  \n",
    "$$ loss_{L2}(w) = ∑_i|w_i^2| $$\n",
    "L2正则化会使参数接近零但不为零，因此该方法可以减少参数值的大小降低复杂度。  \n",
    "##### loss(w) = tf.contrib.layers.l1_reglarizer(REGULARIZER)(w)        loss_l1(w)=Σ|Wi|\n",
    "    eg:\n",
    "        loss_retularization = []\n",
    "        loss_retularization.append(tf.nn.l2_loss(w1))\n",
    "        loss_retularization = tf.reduce_sum(loss_regularization)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0 loss: 0.7345467209815979\n",
      "epoch: 20 loss: 0.07014384120702744\n",
      "epoch: 40 loss: 0.04063370078802109\n",
      "epoch: 60 loss: 0.03103024698793888\n",
      "epoch: 80 loss: 0.027629895135760307\n",
      "epoch: 100 loss: 0.026115337386727333\n",
      "epoch: 120 loss: 0.025203466415405273\n",
      "epoch: 140 loss: 0.02480527199804783\n",
      "epoch: 160 loss: 0.02410784922540188\n",
      "epoch: 180 loss: 0.02294393815100193\n",
      "epoch: 200 loss: 0.022387199103832245\n",
      "epoch: 220 loss: 0.022929077968001366\n",
      "epoch: 240 loss: 0.023137563839554787\n",
      "epoch: 260 loss: 0.023108474910259247\n",
      "epoch: 280 loss: 0.022853925824165344\n",
      "epoch: 300 loss: 0.022794650867581367\n",
      "epoch: 320 loss: 0.02273387648165226\n",
      "epoch: 340 loss: 0.02272939868271351\n",
      "epoch: 360 loss: 0.022703757509589195\n",
      "epoch: 380 loss: 0.022631840780377388\n",
      "*******predict*******\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 导入所需模块\n",
    "import tensorflow as tf\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "# 读入数据/标签 生成x_train y_train\n",
    "df = pd.read_csv('dot.csv')\n",
    "x_data = np.array(df[['x1', 'x2']])\n",
    "y_data = np.array(df['y_c'])\n",
    "\n",
    "x_train = np.vstack(x_data).reshape(-1,2)\n",
    "y_train = np.vstack(y_data).reshape(-1,1)\n",
    "\n",
    "Y_c = [['red' if y else 'blue'] for y in y_train]\n",
    "\n",
    "# 转换x的数据类型，否则后面矩阵相乘时会因数据类型问题报错\n",
    "x_train = tf.cast(x_train, tf.float32)\n",
    "y_train = tf.cast(y_train, tf.float32)\n",
    "\n",
    "# from_tensor_slices函数切分传入的张量的第一个维度，生成相应的数据集，使输入特征和标签值一一对应\n",
    "train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)\n",
    "\n",
    "# 生成神经网络的参数，输入层为2个神经元，隐藏层为11个神经元，1层隐藏层，输出层为1个神经元\n",
    "# 用tf.Variable()保证参数可训练\n",
    "w1 = tf.Variable(tf.random.normal([2, 11]), dtype=tf.float32)\n",
    "b1 = tf.Variable(tf.constant(0.01, shape=[11]))\n",
    "\n",
    "w2 = tf.Variable(tf.random.normal([11, 1]), dtype=tf.float32)\n",
    "b2 = tf.Variable(tf.constant(0.01, shape=[1]))\n",
    "\n",
    "lr = 0.01  # 学习率\n",
    "epoch = 400  # 循环轮数\n",
    "\n",
    "# 训练部分\n",
    "for epoch in range(epoch):\n",
    "    for step, (x_train, y_train) in enumerate(train_db):\n",
    "        with tf.GradientTape() as tape:  # 记录梯度信息\n",
    "\n",
    "            h1 = tf.matmul(x_train, w1) + b1  # 记录神经网络乘加运算\n",
    "            h1 = tf.nn.relu(h1)\n",
    "            y = tf.matmul(h1, w2) + b2\n",
    "\n",
    "            # 采用均方误差损失函数mse = mean(sum(y-out)^2)\n",
    "            loss = tf.reduce_mean(tf.square(y_train - y))\n",
    "\n",
    "        # 计算loss对各个参数的梯度\n",
    "        variables = [w1, b1, w2, b2]\n",
    "        grads = tape.gradient(loss, variables)\n",
    "\n",
    "        # 实现梯度更新\n",
    "        # w1 = w1 - lr * w1_grad tape.gradient是自动求导结果与[w1, b1, w2, b2] 索引为0，1，2，3 \n",
    "        w1.assign_sub(lr * grads[0])\n",
    "        b1.assign_sub(lr * grads[1])\n",
    "        w2.assign_sub(lr * grads[2])\n",
    "        b2.assign_sub(lr * grads[3])\n",
    "\n",
    "    # 每20个epoch，打印loss信息\n",
    "    if epoch % 20 == 0:\n",
    "        print('epoch:', epoch, 'loss:', float(loss))\n",
    "\n",
    "# 预测部分\n",
    "print(\"*******predict*******\")\n",
    "# xx在-3到3之间以步长为0.01，yy在-3到3之间以步长0.01,生成间隔数值点\n",
    "xx, yy = np.mgrid[-3:3:.1, -3:3:.1]\n",
    "# 将xx , yy拉直，并合并配对为二维张量，生成二维坐标点\n",
    "grid = np.c_[xx.ravel(), yy.ravel()]\n",
    "grid = tf.cast(grid, tf.float32)\n",
    "# 将网格坐标点喂入神经网络，进行预测，probs为输出\n",
    "probs = []\n",
    "for x_test in grid:\n",
    "    # 使用训练好的参数进行预测\n",
    "    h1 = tf.matmul([x_test], w1) + b1\n",
    "    h1 = tf.nn.relu(h1)\n",
    "    y = tf.matmul(h1, w2) + b2  # y为预测结果\n",
    "    probs.append(y)\n",
    "\n",
    "# 取第0列给x1，取第1列给x2\n",
    "x1 = x_data[:, 0]\n",
    "x2 = x_data[:, 1]\n",
    "# probs的shape调整成xx的样子\n",
    "probs = np.array(probs).reshape(xx.shape)\n",
    "plt.scatter(x1, x2, color=np.squeeze(Y_c)) #squeeze去掉纬度是1的纬度,相当于去掉[['red'],[''blue]],内层括号变为['red','blue']\n",
    "# 把坐标xx yy和对应的值probs放入contour<[‘kɑntʊr]>函数，给probs值为0.5的所有点上色  plt点show后 显示的是红蓝点的分界线\n",
    "plt.contour(xx, yy, probs, levels=[.5])\n",
    "plt.show()\n",
    "\n",
    "# 读入红蓝点，画出分割线，不包含正则化\n",
    "# 不清楚的数据，建议print出来查看 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0 loss: 1.508154034614563\n",
      "epoch: 20 loss: 0.4008704423904419\n",
      "epoch: 40 loss: 0.3167029321193695\n",
      "epoch: 60 loss: 0.27552172541618347\n",
      "epoch: 80 loss: 0.24501702189445496\n",
      "epoch: 100 loss: 0.22092807292938232\n",
      "epoch: 120 loss: 0.2013540267944336\n",
      "epoch: 140 loss: 0.18339766561985016\n",
      "epoch: 160 loss: 0.1669429987668991\n",
      "epoch: 180 loss: 0.15376755595207214\n",
      "epoch: 200 loss: 0.1427423506975174\n",
      "epoch: 220 loss: 0.1325000524520874\n",
      "epoch: 240 loss: 0.12424086779356003\n",
      "epoch: 260 loss: 0.11736300587654114\n",
      "epoch: 280 loss: 0.11120328307151794\n",
      "epoch: 300 loss: 0.10594076663255692\n",
      "epoch: 320 loss: 0.10158948600292206\n",
      "epoch: 340 loss: 0.09788326174020767\n",
      "epoch: 360 loss: 0.09482546150684357\n",
      "epoch: 380 loss: 0.09227354824542999\n",
      "*******predict*******\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# 读入数据/标签 生成x_train y_train\n",
    "df = pd.read_csv('dot.csv')\n",
    "x_data = np.array(df[['x1', 'x2']])\n",
    "y_data = np.array(df['y_c'])\n",
    "\n",
    "x_train = x_data\n",
    "y_train = y_data.reshape(-1, 1)\n",
    "\n",
    "Y_c = [['red' if y else 'blue'] for y in y_train]\n",
    "\n",
    "# 转换x的数据类型，否则后面矩阵相乘时会因数据类型问题报错\n",
    "x_train = tf.cast(x_train, tf.float32)\n",
    "y_train = tf.cast(y_train, tf.float32)\n",
    "\n",
    "# from_tensor_slices函数切分传入的张量的第一个维度，生成相应的数据集，使输入特征和标签值一一对应\n",
    "train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)\n",
    "\n",
    "# 生成神经网络的参数，输入层为4个神经元，隐藏层为32个神经元，2层隐藏层，输出层为3个神经元\n",
    "# 用tf.Variable()保证参数可训练\n",
    "w1 = tf.Variable(tf.random.normal([2, 11]), dtype=tf.float32)\n",
    "b1 = tf.Variable(tf.constant(0.01, shape=[11]))\n",
    "\n",
    "w2 = tf.Variable(tf.random.normal([11, 1]), dtype=tf.float32)\n",
    "b2 = tf.Variable(tf.constant(0.01, shape=[1]))\n",
    "\n",
    "lr = 0.01  # 学习率为\n",
    "epoch = 400  # 循环轮数\n",
    "\n",
    "# 训练部分\n",
    "for epoch in range(epoch):\n",
    "    for step, (x_train, y_train) in enumerate(train_db):\n",
    "        with tf.GradientTape() as tape:  # 记录梯度信息\n",
    "\n",
    "            h1 = tf.matmul(x_train, w1) + b1  # 记录神经网络乘加运算\n",
    "            h1 = tf.nn.relu(h1)\n",
    "            y = tf.matmul(h1, w2) + b2\n",
    "\n",
    "            # 采用均方误差损失函数mse = mean(sum(y-out)^2)\n",
    "            loss_mse = tf.reduce_mean(tf.square(y_train - y))\n",
    "            # 添加l2正则化\n",
    "            loss_regularization = []\n",
    "            # tf.nn.l2_loss(w)=sum(w ** 2) / 2\n",
    "            loss_regularization.append(tf.nn.l2_loss(w1))\n",
    "            loss_regularization.append(tf.nn.l2_loss(w2))\n",
    "            # 求和\n",
    "            # 例：x=tf.constant(([1,1,1],[1,1,1]))\n",
    "            #   tf.reduce_sum(x)\n",
    "            # >>>6\n",
    "            # loss_regularization = tf.reduce_sum(tf.stack(loss_regularization))\n",
    "            loss_regularization = tf.reduce_sum(loss_regularization)\n",
    "            loss = loss_mse + 0.03 * loss_regularization #REGULARIZER = 0.03\n",
    "\n",
    "        # 计算loss对各个参数的梯度\n",
    "        variables = [w1, b1, w2, b2]\n",
    "        grads = tape.gradient(loss, variables)\n",
    "\n",
    "        # 实现梯度更新\n",
    "        # w1 = w1 - lr * w1_grad\n",
    "        w1.assign_sub(lr * grads[0])\n",
    "        b1.assign_sub(lr * grads[1])\n",
    "        w2.assign_sub(lr * grads[2])\n",
    "        b2.assign_sub(lr * grads[3])\n",
    "\n",
    "    # 每200个epoch，打印loss信息\n",
    "    if epoch % 20 == 0:\n",
    "        print('epoch:', epoch, 'loss:', float(loss))\n",
    "\n",
    "# 预测部分\n",
    "print(\"*******predict*******\")\n",
    "# xx在-3到3之间以步长为0.01，yy在-3到3之间以步长0.01,生成间隔数值点\n",
    "xx, yy = np.mgrid[-3:3:.1, -3:3:.1]\n",
    "# 将xx, yy拉直，并合并配对为二维张量，生成二维坐标点\n",
    "grid = np.c_[xx.ravel(), yy.ravel()]\n",
    "grid = tf.cast(grid, tf.float32)\n",
    "# 将网格坐标点喂入神经网络，进行预测，probs为输出\n",
    "probs = []\n",
    "for x_predict in grid:\n",
    "    # 使用训练好的参数进行预测\n",
    "    h1 = tf.matmul([x_predict], w1) + b1\n",
    "    h1 = tf.nn.relu(h1)\n",
    "    y = tf.matmul(h1, w2) + b2  # y为预测结果\n",
    "    probs.append(y)\n",
    "\n",
    "# 取第0列给x1，取第1列给x2\n",
    "x1 = x_data[:, 0]\n",
    "x2 = x_data[:, 1]\n",
    "# probs的shape调整成xx的样子\n",
    "probs = np.array(probs).reshape(xx.shape)\n",
    "plt.scatter(x1, x2, color=np.squeeze(Y_c))\n",
    "# 把坐标xx yy和对应的值probs放入contour<[‘kɑntʊr]>函数，给probs值为0.5的所有点上色  plt点show后 显示的是红蓝点的分界线\n",
    "plt.contour(xx, yy, probs, levels=[.5])\n",
    "plt.show()\n",
    "\n",
    "# 读入红蓝点，画出分割线，包含正则化\n",
    "# 不清楚的数据，建议print出来查看 "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
